home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / recent2 / yamtools.lha / yamtools1.4 / YAMTOOLS.rexx < prev    next >
OS/2 REXX Batch file  |  1997-03-28  |  80KB  |  2,190 lines

  1. /******************************************************************************/
  2. /*                                                                            */
  3. /*                            YAMTOOLS                                        */
  4. /*                 Copyright ©1997 by Dick Whiting                            */
  5. /*                                                                            */
  6. /*----------------------------------------------------------------------------*/
  7. /*                                                                            */
  8. /* Standard Disclaimer: I wrote it, it works for me, I don't guarantee        */
  9. /* that it will do anything productive for anyone else, etc. etc. ;-)         */
  10. /*                                                                            */
  11. /*HOWEVER, if you DO find a use for it: I homeschool my kids and they         */
  12. /*would love a postcard from where EVER you live.                             */
  13. /*                                                                            */
  14. /*Instant GEOGRAPHY lesson;)                                                  */
  15. /*                                                                            */
  16. /*                                                                            */
  17. /*POSTCARDS:    Dick Whiting                                                  */
  18. /*              28590 S. Beavercreek Rd.                                      */
  19. /*              Mulino, Oregon 97042                                          */
  20. /*              USA                                                           */
  21. /*                                                                            */
  22. /*----------------------------------------------------------------------------*/
  23. /*                                                                            */
  24. /*               Address Bug Reports or Comments to:                          */
  25. /*                Dick Whiting <dwhiting@europa.com>                          */
  26. /*                           28 March 1997                                    */
  27. /*                                                                            */
  28. /******************************************************************************/
  29. /*
  30. $VER: 1.4 Copyright ©1997 by Dick Whiting
  31. $AUTHOR: Dick Whiting
  32. $DESCRIPTION: Add-on Tools for Marcel Beck's wonderful YAM
  33. */
  34.  
  35. options results
  36. options failat 21
  37.  
  38. subrtn=''
  39. parm=''
  40. rest=''
  41.  
  42. parse arg subrtn parm rest
  43.  
  44. /******************************************************************************/
  45. /*                      MUIREXX TAGS & VARIABLES                              */
  46. /******************************************************************************/
  47.  
  48. Application_AboutMUI =      0x8042d21d
  49. Application_OpenConfigWindow = 0x804299ba
  50.  
  51. MUIA_Application_Author =   0x80424842
  52. MUIA_Application_Base =     0x8042e07a
  53. MUIA_Application_Copyright= 0x8042ef4d
  54. MUIA_Application_Description=0x80421fc6
  55. MUIA_Application_Title =    0x804281b8
  56. MUIA_Application_Version =  0x8042b33f
  57.  
  58. MUIA_Background  =          0x8042545b
  59. MUIA_CycleChain =           0x80421ce7
  60. MUIA_Disabled =             0x80423661
  61. MUIA_Draggable =            0x80420b6e 
  62. MUIA_DrawersOnly =          0x8008002F
  63. MUIA_Dropable =             0x8042fbce 
  64. MUIA_Font =                 0x8042be50
  65. MUIA_Frame  =               0x8042ac64
  66. MUIA_HorizWeight =          0x80426db9
  67. MUIA_Group_Columns =        0x8042f416
  68. MUIA_Group_SameSize =       0x80420860
  69. MUIA_List_Active =          0x8042391c 
  70. MUIA_List_DragSortable =    0x80426099
  71. MUIA_List_Entries =         0x80421654 
  72. MUIA_List_Format =          0x80423c0a 
  73. MUIA_List_InsertPosition =  0x8042d0cd
  74. MUIA_List_Quiet =           0x8042d8c7 
  75. MUIA_List_ShowDropMarks =   0x8042c6f3 
  76. MUIA_Listview_DoubleClick = 0x80424635
  77. MUIA_Listview_DragType =    0x80425cd3
  78. MUIA_Listview_MultiSelect = 0x80427e08
  79. MUIA_Listview_SelectChange= 0x8042178f 
  80. MUIA_Menuitem_Shortcut =    0x80422030 
  81. MUIA_Menuitem_Title =       0x804218be 
  82. MUIA_Numeric_Max =          0x8042d78a
  83. MUIA_Numeric_Min =          0x8042e404
  84. MUIA_Numeric_Default =      0x804263e8
  85. MUIA_Scrollgroup_FreeHoriz =0x804292f3
  86. MUIA_Selected =             0x8042654b
  87. MUIA_ShowMe =               0x80429ba8
  88. MUIA_String_AdvanceOnCR =   0x804226de
  89. MUIA_VertWeight =           0x804298d0 
  90. MUIA_Weight =               0x80421d1f 
  91. MUIA_Window_DepthGadget  =  0x80421923
  92. MUIA_Window_DragBar  =      0x8042045d
  93. MUIA_Window_ActiveObject =  0x80427925
  94. MUIA_Window_PublicScreen =  0x804278e4
  95. MUIA_Window_SizeGadget  =   0x8042e33d
  96.  
  97. MUIM_List_Clear =           0x8042ad89
  98. MUIM_List_GetEntry =        0x804280ec 
  99. MUIM_List_NextSelected =    0x80425f17
  100.  
  101. ASLFR_InitialFile =         0x80080008
  102. ASLFR_InitialDrawer =       0x80080009
  103.  
  104. TRUE=1
  105. FALSE=0
  106.  
  107. MUIV_Font_Big = -6
  108. MUIV_Frame_None  = 0
  109. MUIV_List_GetEntry_Active = -1
  110. MUIV_List_Insert_Active = -1
  111. MUIV_List_Insert_Bottom = -3
  112. MUIV_List_Insert_Top = 0
  113. MUIV_Listview_DragType_Immediate = 1
  114. MUIV_Listview_MultiSelect_Shifted = 2
  115. MUII_WindowBack  = 0
  116. MUIV_Window_ActiveObject_Next = -1
  117.  
  118. /**************************************************************************/
  119. /*           Various values used throughout the various routines          */
  120. /**************************************************************************/
  121. aboutlist=TRUE                              /* show list in about window  */
  122. comma=','                                   /* used in string building    */
  123. configheader='YamTools Configuration File -- Copyright by Dick Whiting'
  124. delaytm=20                                  /* wait time per loop         */
  125. emptyconfig='empty'||comma||'none'||comma||'<----available---->' 
  126. fontsize=''                                 /* used to change FONT size   */
  127. infolines=28                                /* number of header lines     */
  128. infotitle="YAM Tools Info"                  /* default title on infomsg   */
  129. maxarchs=50000                              /* very large number for loop */
  130. missing='.'                                 /* indicate missing value     */
  131. showbusy=FALSE                              /* don't show busy indicator  */
  132. shutdown=FALSE                              /* flag for quitting YAMTOOLS */
  133. timestamp=time('S')                         /* timestamp for temp files   */
  134. goodconfig=TRUE                             /* assume config good         */
  135. Bcolmax=6                                   /* max number of columns      */
  136. Browmax=16                                  /* maximum rows of buttons    */
  137. emptymax=5            /* allow for 5 delete folders in a row -- arbitrary */
  138.  
  139. /**************************************************************************/
  140. /*           Help Messages to display with MUI bubble facility.           */
  141. /*                                                                        */
  142. /* Format is simple: help.ID where ID is the id specified on the MUI      */
  143. /* object statement.                                                      */
  144. /* Similar approach for accessing the .guide information using the NODE   */
  145. /* option on the object statement.                                        */
  146. /*                                                                        */
  147. /**************************************************************************/
  148.  
  149. help.ALST='"Select Folders to search\nor run ARexx Program against"'
  150. help.ARLD='"Use to load/reload folder list\nRequired if you add\nor delete folders"'
  151. help.B00= '"Executes ARexx Program defined in Configuration"'
  152. help.CFG4='"Save & Use currently defined configuration to file"'
  153. help.CFG5='"Use currently defined configuration"'
  154. help.CFG6='"Reload & Use last SAVED/LOADED configuration file"'
  155. help.CFG7='"Clear Selected Entry\n(Remove Script)"'
  156. help.CFG9='"Undo LAST edited entry in list"'
  157. help.CFG1='"Label to appear on button"'
  158. help.CFG2='"Type of processing to do\n- See Documentation or press HELP"'
  159. help.CFG3='"ARexx program to execute when button is pressed"'
  160. help.CFGF='"Location of FlashFind program - required"'
  161. help.CFGM='"Current Mail Directory YAM is using - required"'
  162. help.CFGQ='"Location of QuickSort program - required"'
  163. help.CFGC='"Number of columns of buttons for ARexx programs\nChange takes effect after SAVE and RESTART"'
  164. help.CFGR='"Number of rows of buttons for ARexx programs\nChange takes effect after SAVE and RESTART"'
  165. help.CLST='"Double click to edit entry\nDrag&Drop to Sort"'
  166. help.MDIR='"Currently defined Mail Directory - change on Config page"'
  167. help.MLST='"Double click to READ\nSelect for ARexx Execution target"'
  168. help.SLOG='"Match Any (OR logic)\nMatch All (AND logic)\nfor mail searching"'
  169. help.SQUIT='"INTERRUPT will show results upto this point\nABORT stops ALL processing"'
  170. help.SRC1='"Enter strings to Search for"'
  171. help.SRC2='"Enter strings to Search for"'
  172. help.SRC3='"Enter strings to Search for"'
  173. help.SRCA='"Searches in ALL lines of mail for search strings"'
  174. help.SRCF='"Searches From: Reply-To: Sender:\nlines in mail for search strings"'
  175. help.SRCM='"Searches NON-header\nlines in mail for search strings"'
  176. help.SRCS='"Searches Subject:\nlines in mail for search strings"'
  177. help.SRCT='"Searches To: CC:\nlines in mail for search strings"'
  178. help.SRCX='"Start the Search"'
  179. help.STEXT='"Information Message\nRead it;)"'
  180.  
  181. /**************************************************************************/
  182. /*               Pointers into the YamTools.guide documentation           */
  183. /**************************************************************************/
  184. node.ALST='4.1.'
  185. node.ARLD='4.1.'
  186. node.B00='6.2.'
  187. node.CFG4='6.2.'
  188. node.CFG5='6.2.'
  189. node.CFG6='6.2.'
  190. node.CFG7='6.2.'
  191. node.CFG9='6.2.'
  192. node.CFG1='6.2.'
  193. node.CFG2='6.2.'
  194. node.CFG3='6.2.'
  195. node.CFGF='6.1.'
  196. node.CFGM='6.1.'
  197. node.CFGQ='6.1.'
  198. node.CFGC='6.2.'
  199. node.CFGR='6.2.'
  200. node.CLST='6.2.'
  201. node.MDIR='6.1.'
  202. node.MLST='5.1.'
  203. node.SLOG='4.3.'
  204. node.SQUIT='7.2.'
  205. node.SRC1='4.3.'
  206. node.SRC2='4.3.'
  207. node.SRC3='4.3.'
  208. node.SRCA='4.3.'
  209. node.SRCF='4.3.'
  210. node.SRCM='4.3.'
  211. node.SRCS='4.3.'
  212. node.SRCT='4.3.'
  213. node.SRCX='4.3.'
  214. node.STEXT='7.2.'
  215.  
  216. /**************************************************************************/
  217. /*                                                                        */
  218. /*                       Main Logic Routine                               */
  219. /*                                                                        */
  220. /**************************************************************************/
  221.  
  222. Address YAMTOOLS
  223.  
  224. Call CheckYam                               /* No YAM-no sense running    */
  225.  
  226. if subrtn~='' then do                       /* check vars nth time        */
  227.    getvar YAMTOOLSDEBUG                     /* see if we're debugging     */ 
  228.    debug=result
  229.    getvar YAMTOOLSROWS                      /* number of rows of buttons  */
  230.    Brows=result
  231.    getvar YAMTOOLSCOLS                      /* number of cols of buttons  */
  232.    Bcols=result
  233. end
  234.  
  235. if debug~=TRUE then debug=FALSE
  236.  
  237. if debug then say 'subrtn='subrtn 
  238. if debug then say 'parm='parm
  239. if debug then say 'rest='rest
  240.  
  241. Select
  242.    when subrtn=''   then do                 /* first time - setup window  */
  243.       Call LoadConfig                       /* load config or defaults    */
  244.       setvar YAMTOOLSROWS Brows             /* button rows for this run   */
  245.       setvar YAMTOOLSCOLS Bcols             /* button cols for this run   */
  246.       Call EnsureLibs                       /* make sure all libs present */
  247.       Call ValidateConfig                   /* check config options       */
  248.       if goodconfig then do                 /* found a valid config-use it*/ 
  249.          Call GetArchList                   /* get all folder info        */
  250.          Call ExpandAssigns                 /* change assigns to vols     */ 
  251.          Call GetVolume                     /* change devs to vols        */
  252.          Call CheckArchs                    /* make sure all exist        */
  253.          Call LoadArchList                  /* build & show folder list   */     
  254.          window ID YTINF CLOSE              /* close info window          */
  255.       end
  256.       else do                               /* invalid or not found       */
  257.          group ID YTPGS LABELS 'Config'
  258.          errmsg='Configuration File not Found or has errors\nPlease enter information\nand SAVE'
  259.          Call ErrorMsg 
  260.       end
  261.    end
  262.    when subrtn='RESCAN' then do             /* reload folder list         */
  263.       Call ClrArchList                      /* clear list in preparation  */
  264.       Call GetArchList                      /* get all folder info        */
  265.       Call ExpandAssigns                    /* change assigns to vols     */
  266.       Call GetVolume                        /* change devs to vols        */
  267.       Call CheckArchs                       /* make sure all exist        */
  268.       Call LoadArchList                     /* build & show folder list   */
  269.       window ID YTINF CLOSE                 /* close info window          */
  270.    end
  271.    when subrtn='SETALL'   then Call SetAllCheck      /* toggle checkmarks */
  272.    when subrtn='READMAIL' then Call ReadMail         /* read selected mail*/  
  273.    when subrtn='BUTTON'   then Call DoRexxButton     /* execute a button  */
  274.    when subrtn='CONFIGEDIT' then Call ConfigEdit     /* modify config     */
  275.    when subrtn='ABOUT'  then Call AboutProgs         /* show About info   */
  276.    when subrtn='LISTMAIL' then Call ListMail         /* all mail in folder*/  
  277.    when subrtn='SEARCH' then Call SearchArchs        /* do the searches   */  
  278.    otherwise nop                                     /* never happen ;)   */
  279. end
  280.  
  281. exit
  282.  
  283. /******************************************************************************/
  284. /*                      MUIREXX WINDOW DEFINITION                             */
  285. /******************************************************************************/
  286. BuildWindow:
  287.  
  288. window ID YTWIN COMMAND '"quit"' PORT YAMTOOLS TITLE '"YAM Tools"',
  289.    ATTRS MUIA_Window_PublicScreen screen
  290.    menu LABEL '"Project"'
  291.       menu LABEL '"About..."'
  292.          item COMMAND '"YamTools.rexx ABOUT YAMTOOLS"' LABEL '"YamTools"'
  293.          item COMMAND '"YamTools.rexx ABOUT YAM"' LABEL '"YAM"'
  294.          item COMMAND '"YamTools.rexx ABOUT MUIREXX"' LABEL '"MuiRexx"'
  295.          item COMMAND '"method 'Application_AboutMUI' 0"' PORT YAMTOOLS LABEL '"MUI"'
  296.       endmenu
  297.       item ATTRS MUIA_Menuitem_Title '-1'
  298.       menu LABEL '"Settings"'
  299.           item COMMAND '"method 'Application_OpenConfigWindow'"' PORT YAMTOOLS LABEL '"MUI..."'
  300.       endmenu
  301.       item ATTRS MUIA_Menuitem_Title '-1'
  302.       item COMMAND '"YamTools.rexx CONFIGEDIT SAVE"' ATTRS MUIA_Menuitem_Shortcut 'S' LABEL '"Save"'
  303.       item COMMAND '"YamTools.rexx CONFIGEDIT SAVEAS"' ATTRS MUIA_Menuitem_Shortcut 'W' LABEL '"SaveAs..."'
  304.       item COMMAND '"YamTools.rexx CONFIGEDIT READ"' ATTRS MUIA_Menuitem_Shortcut 'O' LABEL '"Open..."'
  305.       item ATTRS MUIA_Menuitem_Title '-1'
  306.       item COMMAND '"quit"' PORT YAMTOOLS ATTRS MUIA_Menuitem_Shortcut 'Q' LABEL '"Quit"'
  307.    endmenu
  308.    group ID YTPGS LABELS '"Folder List,Mail List,Config"' REGISTER
  309.  
  310. /* Folder List Page */
  311.       group 
  312.          group HORIZ
  313.             group
  314.                label DOUBLE '"Mail Directory:"'
  315.             endgroup
  316.             group
  317.                text ID MDIR HELP help.MDIR NODE node.MDIR
  318.             endgroup
  319.          endgroup
  320.          group HORIZ MUIA_VertWeight 200 MUIA_HorizWeight 100
  321.             group 
  322.                list ID ALST TITLE '"\033bYam Folder,\033bCount,,"',
  323.                   COMMAND '"YamTools.rexx LISTMAIL %s"' HELP help.ALST NODE node.ALST,
  324.                   INSERT NODUP ATTRS MUIA_Listview_MultiSelect MUIV_Listview_MultiSelect_Shifted,
  325.                   MUIA_List_Format '"MAXWIDTH=75 MINWIDTH=-1 WEIGHT=75 P=\033l BAR,MAXWIDTH=25 MINWIDTH=-1 WEIGHT=25 P=\033r,WEIGHT=0 MAXWIDTH=0 MINWIDTH=0,WEIGHT=0 MAXWIDTH=0 MINWIDTH=0"'
  326.                button ID ARLD COMMAND '"YamTools.rexx RESCAN"',
  327.                       HELP help.ARLD NODE node.ARLD PRESS LABEL "Load Folder List"
  328.             endgroup
  329.             group FRAME MUIA_HorizWeight 100
  330.                label '"\033c\033bSearch Types of Lines"'
  331.                group HORIZ
  332.                   group HORIZ
  333.                      group
  334.                         label DOUBLE '"\033lFROM:"'
  335.                         label DOUBLE '"\033lTO:"'
  336.                      endgroup
  337.                      group
  338.                         check ID SRCF COMMAND '"YamTools.rexx SETALL SRCF"', 
  339.                            HELP help.SRCF NODE node.SRCF ATTRS MUIA_Selected FALSE
  340.                         check ID SRCT COMMAND '"YamTools.rexx SETALL SRCT"', 
  341.                            HELP help.SRCT NODE node.SRCT ATTRS MUIA_Selected FALSE
  342.                      endgroup
  343.                   endgroup
  344.                   group HORIZ
  345.                      group
  346.                         label DOUBLE '"\033lSUBJECT:"'
  347.                         label DOUBLE '"\033lTEXT:"'
  348.                      endgroup
  349.                      group
  350.                         check ID SRCS COMMAND '"YamTools.rexx SETALL SRCS"', 
  351.                            HELP help.SRCS NODE node.SRCS ATTRS MUIA_Selected FALSE
  352.                         check ID SRCM COMMAND '"YamTools.rexx SETALL SRCM"', 
  353.                            HELP help.SRCM NODE node.SRCM ATTRS MUIA_Selected FALSE
  354.                      endgroup
  355.                   endgroup
  356.                endgroup
  357.                group HORIZ
  358.                   label DOUBLE '"\033lALL Lines:"'
  359.                   check ID SRCA COMMAND '"YamTools.rexx SETALL SRCA"', 
  360.                         HELP help.SRCA NODE node.SRCA ATTRS MUIA_Selected TRUE 
  361.                endgroup
  362.                group 
  363.                   group HORIZ
  364.                      group
  365.                         radio ID SLOG HELP help.SLOG NODE node.SLOG,
  366.                               LABELS '"Match Any,Match All"'
  367.                      endgroup
  368.                   endgroup
  369.                   group 
  370.                      space HORIZ 150
  371.                      label  '"\033l\033bEnter Search Strings:"'
  372.                      string ID SRC1 HELP help.SRC1 NODE node.SRC1, 
  373.                             ATTRS MUIA_CycleChain TRUE, 
  374.                             MUIA_String_AdvanceOnCR TRUE,        
  375.                             CONTENT ''
  376.                      string ID SRC2 HELP help.SRC2 NODE node.SRC2,
  377.                             ATTRS MUIA_CycleChain TRUE,
  378.                             MUIA_String_AdvanceOnCR TRUE,        
  379.                             CONTENT ''
  380.                      string ID SRC3 HELP help.SRC3 NODE node.SRC3,
  381.                             ATTRS MUIA_CycleChain TRUE,
  382.                             MUIA_String_AdvanceOnCR TRUE,        
  383.                             CONTENT ''
  384.                   endgroup
  385.                   group
  386.                      button ID SRCX HELP help.SRCX NODE node.SRCX,
  387.                             COMMAND '"YamTools.rexx SEARCH"', 
  388.                             PRESS ATTRS MUIA_CycleChain TRUE MUIA_Disabled FALSE,
  389.                             LABEL 'Search'
  390.                   endgroup
  391.                endgroup
  392.             endgroup
  393.          endgroup
  394.       endgroup
  395.  
  396. /* Mail List Page */
  397.       group ATTRS MUIA_HorizWeight 100
  398.          list ID MLST COMMAND '"YamTools.rexx READMAIL %s"', 
  399.             HELP help.MLST NODE node.MLST,
  400.             TITLE '"\033bYam Folder,\033bFrom,\033bSubject,\033bTo:,,,"',
  401.             INSERT NODUP ATTRS MUIA_Listview_MultiSelect MUIV_Listview_MultiSelect_Shifted,
  402.             MUIA_List_Format '"BAR,BAR,BAR,,WEIGHT=0 MAXWIDTH=0 MINWIDTH=0,WEIGHT=0 MAXWIDTH=0 MINWIDTH=0,WEIGHT=0 MAXWIDTH=0 MINWIDTH=0"'
  403.       endgroup
  404.  
  405. /* Configuration Page */
  406.       group 
  407.          group FRAME 
  408.             group HORIZ
  409.                group
  410.                    label DOUBLE '\033b\033lMail Directory:'
  411.                endgroup
  412.                group
  413.                    popasl ID CFGM HELP help.CFGM NODE node.CFGM,
  414.                          ATTRS MUIA_DrawersOnly TRUE,
  415.                          MUIA_CycleChain TRUE, 
  416.                          MUIA_String_AdvanceOnCR TRUE
  417.                      endgroup
  418.             endgroup
  419.             group HORIZ
  420.                group 
  421.                    label DOUBLE '\033b\033lFlashFind:'
  422.                 endgroup
  423.                 group
  424.                    popasl ID CFGF HELP help.CFGF NODE node.CFGF,
  425.                          ATTRS MUIA_CycleChain TRUE, 
  426.                          MUIA_String_AdvanceOnCR TRUE
  427.                 endgroup
  428.                 group
  429.                    label DOUBLE '\033b\033lQuickSort:'
  430.                 endgroup
  431.                 group
  432.                    popasl ID CFGQ HELP help.CFGQ NODE node.CFGQ,
  433.                          ATTRS MUIA_CycleChain TRUE, 
  434.                          MUIA_String_AdvanceOnCR TRUE
  435.                 endgroup
  436.             endgroup
  437.          endgroup
  438.          group HORIZ 
  439.             group ATTRS MUIA_HorizWeight 300 MUIA_VertWeight 200
  440.                list ID CLST TITLE '"\033bLabel,\033bType,\033bCommand"',
  441.                   HELP help.CLST NODE node.CLST,
  442.                   DROP INSERT PRESS COMMAND '"YamTools.rexx CONFIGEDIT EDIT %s"',
  443.                   ATTRS MUIA_Listview_DragType MUIV_Listview_DragType_Immediate, 
  444.                      MUIA_List_DragSortable TRUE MUIA_List_ShowDropMarks TRUE,
  445.                      MUIA_Listview_DoubleClick TRUE,
  446.                      MUIA_List_Format '"BAR,BAR,"'
  447.             endgroup
  448.             group 
  449.                button ID CFG4 COMMAND '"YamTools.rexx CONFIGEDIT SAVE"',
  450.                       HELP help.CFG4 NODE node.CFG4 PRESS LABEL 'SAVE'
  451.                button ID CFG5 COMMAND '"YamTools.rexx CONFIGEDIT USE"',
  452.                       HELP help.CFG5 NODE node.CFG5 PRESS LABEL 'USE'
  453.                button ID CFG6 COMMAND '"YamTools.rexx CONFIGEDIT RELOAD"',
  454.                       HELP help.CFG6 NODE node.CFG6 PRESS LABEL 'RELOAD'
  455.                space
  456.                button ID CFG7 COMMAND '"YamTools.rexx CONFIGEDIT CLEAR"',
  457.                       HELP help.CFG7 NODE node.CFG7 PRESS LABEL 'CLEAR'
  458.                button ID CFG9 COMMAND '"YamTools.rexx CONFIGEDIT UNDO"',
  459.                       HELP help.CFG9 NODE node.CFG9 PRESS LABEL 'UNDO'
  460.             endgroup
  461.          endgroup
  462.          group FRAME
  463.             group HORIZ
  464.                group
  465.                   label DOUBLE '\033bLabel:'
  466.                endgroup
  467.                group
  468.                   string ID CFG1 COMMAND '"YamTools.rexx CONFIGEDIT UPDATE"',
  469.                          HELP help.CFG1 NODE node.CFG1,
  470.                          ATTRS MUIA_CycleChain TRUE,
  471.                          MUIA_String_AdvanceOnCR TRUE,
  472.                          CONTENT ''
  473.                endgroup
  474.                group
  475.                   label DOUBLE '\033bType:'
  476.                endgroup
  477.                group
  478.                   cycle ID CFG2 COMMAND '"YamTools.rexx CONFIGEDIT UPDATE"', 
  479.                         HELP help.CFG2 NODE node.CFG2,
  480.                         ATTRS MUIA_CycleChain TRUE,                            
  481.                         MUIA_String_AdvanceOnCR TRUE,
  482.                         LABELS 'Mail,Folder,Once'
  483.                endgroup
  484.             endgroup
  485.             group HORIZ
  486.                group
  487.                   label DOUBLE '\033b\033lARexx:'
  488.                endgroup   
  489.                group
  490.                   popasl ID CFG3 COMMAND '"YamTools.rexx CONFIGEDIT UPDATE"', 
  491.                          HELP help.CFG3 NODE node.CFG3,
  492.                          ATTRS MUIA_CycleChain TRUE,
  493.                          MUIA_String_AdvanceOnCR TRUE,
  494.                          CONTENT 'YAM:REXX'
  495.                endgroup
  496.                group
  497.                   label DOUBLE '\033bCols:'
  498.                endgroup
  499.                group
  500.                   popslider ID CFGC HELP help.CFGC NODE node.CFGC,
  501.                   ATTRS MUIA_Numeric_Default bcols MUIA_Numeric_Max bcolmax MUIA_Numeric_Min 1
  502.                endgroup
  503.                group
  504.                   label DOUBLE '\033bRows:'
  505.                endgroup
  506.                group
  507.                   popslider ID CFGR HELP help.CFGR NODE node.CFGR,
  508.                   ATTRS MUIA_Numeric_Default brows MUIA_Numeric_Max browmax MUIA_Numeric_Min 1
  509.                endgroup
  510.             endgroup   
  511.          endgroup 
  512.       endgroup 
  513.    endgroup
  514.  
  515. /* Command Buttons */
  516.    group FRAME SCROLL ATTRS MUIA_Scrollgroup_FreeHoriz FALSE
  517.       group ATTRS MUIA_Group_Columns bcols
  518.       do i=1 to (Brows*Bcols)
  519.          bnum=right(i,2,'0')
  520.          bid='B'||right(i,2,'0')
  521.          button ID bid COMMAND '"YamTools.rexx BUTTON 'bnum '"' PRESS HELP help.B00 NODE node.B00
  522.       end
  523.       endgroup
  524.    endgroup
  525. endwindow
  526.  
  527. application ATTRS MUIA_Application_Author '"Dick Whiting"', 
  528.             MUIA_Application_Base '"YAMTOOLS"',
  529.             MUIA_Application_Copyright '"Copyright ©1997 by Dick Whiting"',
  530.             MUIA_Application_Description '" Add-On Tools For YAM"',
  531.             MUIA_Application_Title '"YamTools"',
  532.             MUIA_Application_Version '"Version 1.4"'
  533.  
  534. Return
  535.  
  536. /**************************************************************************/
  537. /*              Make sure YAM is running & visible.                       */
  538. /**************************************************************************/
  539. CheckYAM:
  540.  
  541.    if ~show('p','YAM') then do
  542.       errmsg='You need YAM running to use YAMTOOLS'
  543.       if subrtn='' then do
  544.          shutdown=TRUE
  545.       end
  546.       else do
  547.          shutdown=FALSE
  548.       end
  549.       Call ErrorMsg  
  550.    end
  551.  
  552.    Address YAM 'show'                       /* uniconify YAM's screen     */  
  553.  
  554.     Address YAM 'info SCREEN'                /* get YAM's screen           */
  555.     screen=result
  556.     if screen='' then screen='Workbench'
  557.  
  558. Return
  559.  
  560. /**************************************************************************/
  561. /*                                                                        */
  562. /*              Make sure that we have all the libs we need:              */
  563. /*                               RexxSupport                              */
  564. /*                               QuickSort                                */
  565. /*                                                                        */
  566. /**************************************************************************/
  567. EnsureLibs:
  568.  
  569.    if ~show('L','rexxsupport.library') then do
  570.       addlib('rexxsupport.library',0,-30)
  571.    end
  572.  
  573.    if ~show('P','QuickSortPort') then do
  574.       address Command "run >nil: "qsortprog
  575.       do i = 1 to 10
  576.          if ~show('P','QuickSortPort') then foo=delay(delaytm)
  577.          else leave i
  578.       end
  579.    end
  580.    if show('P','QuickSortPort') then do
  581.       call addlib('QuickSortPort',-30)
  582.    end
  583.    else do
  584.       errmsg='Unable to find QuickSort -- check installation instructions'
  585.       signal ErrorMsg
  586.    end
  587.  
  588. Return
  589.  
  590. /**************************************************************************/
  591. /*              Expand Assign Names for YAM folders                       */
  592. /*                                                                        */
  593. /*  FlashFind reports back on the volume:directory/subdir/file so to make */
  594. /*  sure we can accurately identify and match files, we'll change assigns */
  595. /*  to this format.                                                       */
  596. /*                                                                        */
  597. /**************************************************************************/
  598. ExpandAssigns:
  599.  
  600.    assign.=missing
  601.    assign.0=0
  602.  
  603.    assignfile='T:YTassigns.'||timestamp
  604.  
  605.    text ID MDIR 
  606.    maildir=result
  607.    if maildir='' then do
  608.       errmsg='You MUST set Mail Directory in Configuration'
  609.       signal ErrorMsg 
  610.    end
  611.  
  612.    Address Command "assign > "assignfile
  613.    foo=delay(delaytm*3)
  614.    goodopen=open('IN',assignfile,'R')
  615.    if goodopen then do 
  616.       do until eof('IN')
  617.          linein=readln('IN')
  618.          if pos('Directories:',linein)>0 then do
  619.             do until eof('IN') 
  620.                linein=readln('IN')
  621.                if linein='' then signal CloseAssign
  622.                assign.0=1+assign.0
  623.                aptr=assign.0
  624.                assign.aptr=word(linein,1)
  625.                avol=word(linein,2)
  626.                avol=translate(avol,'    ','<>[]')
  627.                avol=strip(avol)
  628.                assign.aptr.1=avol
  629.             end
  630.          end
  631.       end
  632.    end
  633.    else do 
  634.       errmsg='Couldnt open assignfile: 'assignfile  
  635.       Call ErrorMsg
  636.    end
  637.  
  638. CloseAssign:
  639.  
  640.    result=close('IN')
  641.  
  642.    if pos(':',maildir)>0 then do
  643.       testvol=substr(maildir,1,pos(':',maildir)-1)
  644.       restvol=substr(maildir,pos(':',maildir)+1)
  645.       do j=1 to assign.0
  646.          if upper(assign.j)=upper(testvol) then do 
  647.             maildir=assign.j.1
  648.             if right(maildir,1)~=':' then do 
  649.                if restvol~='' then maildir=maildir||'/'||restvol
  650.             end
  651.             leave j
  652.          end
  653.       end
  654.    end
  655.  
  656.    do i=1 to finfo.0
  657.       if pos(':',finfo.i.1.1)>0 then do
  658.          testvol=substr(finfo.i.1.1,1,pos(':',finfo.i.1.1)-1)
  659.          restvol=substr(finfo.i.1.1,pos(':',finfo.i.1.1)+1)
  660.          do j=1 to assign.0
  661.             if upper(assign.j)=upper(testvol) then do 
  662.                testvol=assign.j.1
  663.                if right(testvol,1)~=':' then do 
  664.                   if restvol~='' then testvol=testvol||'/'||restvol
  665.                end
  666.                finfo.i.1.1=testvol
  667.                leave j
  668.             end
  669.          end
  670.       end
  671.       else do
  672.          if right(maildir,1)=':' then finfo.i.1.1=maildir||finfo.i.1.1
  673.          else finfo.i.1.1=maildir||'/'||finfo.i.1.1
  674.       end
  675.    end
  676.  
  677.     if exists(assignfile) then do
  678.         Address Command 'Delete 'assignfile 'QUIET'
  679.    end
  680.  
  681. Return
  682.  
  683. /**************************************************************************/
  684. /*              Change DEV names to VOLUME names                          */
  685. /*                                                                        */
  686. /*  FlashFind reports back on the volume:directory/subdir/file so to make */
  687. /*  sure we can accurately identify and match files, we'll change device  */
  688. /*  names to volume names.                                                */
  689. /*                                                                        */
  690. /**************************************************************************/
  691. GetVolume:
  692.  
  693.    volume.=missing
  694.    volume.0=0
  695.  
  696.    volumefile='T:YTvolumes.'||timestamp
  697.  
  698.    Address Command "info > "volumefile
  699.    foo=delay(delaytm*3)
  700.    goodopen=open('IN',volumefile,'R')
  701.    if goodopen then do 
  702.       do until eof('IN')
  703.          linein=readln('IN')
  704.          if word(linein,1)='Unit' then do
  705.             do until eof('IN') 
  706.                linein=readln('IN')
  707.                if linein='' then signal CloseVolume
  708.                volume.0=1+volume.0
  709.                vptr=volume.0
  710.                volume.vptr=word(linein,1)
  711.                if words(linein)>=8 then do
  712.                   volume.vptr.1=subword(linein,8)
  713.                end
  714.             end
  715.          end
  716.       end
  717.    end
  718.    else do 
  719.       errmsg='Couldnt open volumefile: 'volumefile
  720.       Call ErrorMsg
  721.    end
  722.  
  723. CloseVolume:
  724.  
  725.    result=close('IN')
  726.  
  727.    do i=1 to finfo.0
  728.       if pos(':',finfo.i.1.1)>0 then do
  729.          testvol=substr(finfo.i.1.1,1,pos(':',finfo.i.1.1)-1)
  730.          restvol=substr(finfo.i.1.1,pos(':',finfo.i.1.1)+1)
  731.          do j=1 to volume.0
  732.             if upper(volume.j)=upper(testvol) then do 
  733.                testvol=volume.j.1
  734.                if right(testvol,1)~=':' then do 
  735.                   if restvol~='' then testvol=testvol||'/'||restvol
  736.                end
  737.                finfo.i.1.1=testvol
  738.                leave j
  739.             end
  740.          end
  741.       end
  742.       else do
  743.          if right(maildir,1)=':' then finfo.i.1.1=maildir||finfo.i.1.1
  744.          else finfo.i.1.1=maildir||'/'||finfo.i.1.1
  745.       end
  746.    end
  747.  
  748.     if exists(volumefile) then do
  749.         Address Command 'Delete 'volumefile 'QUIET'
  750.    end
  751.  
  752. Return
  753.  
  754. /******************************************************************************/
  755. /*                                                                            */
  756. /* Make sure that all of the folders actually exist as directories.           */
  757. /* They might NOT if the user sets the wrong MAILDIR: in the configuration.   */
  758. /*                                                                            */
  759. /******************************************************************************/
  760. CheckArchs:
  761.  
  762.    do i=1 to finfo.0
  763.       if ~exists(finfo.i.1.1) then do
  764.          errmsg='"One of more folders do not exist as directory names.\nCheck that MailDir is specified correctly and reload Folder list"'
  765.          shutdown=FALSE
  766.          window ID YTINF CLOSE
  767.          Call ErrorMsg
  768.       end
  769.    end
  770.  
  771.  
  772. Return
  773.  
  774. /******************************************************************************/
  775. /*                                                                            */
  776. /* Ask YAM for each folder name, its number, and its path.                    */
  777. /* Remember to set folder back to original before leaving.                    */
  778. /*                                                                            */
  779. /******************************************************************************/
  780. GetArchList:
  781.  
  782.    infotext='Getting Folder List'
  783.    infobuttons=''
  784.    showbusy=TRUE
  785.    Call InfoWindow
  786.  
  787.    Address YAM 'getfolderinfo number'
  788.    origfolder=result
  789.  
  790.    idx=0
  791.    emptycnt=0                             /* allow for 5 deleted in a row */
  792.    Do i=0 to maxarchs
  793.       Address YAM 'setfolder ' i
  794.       sfrc=rc
  795.       if sfrc=0 then do
  796.          idx=idx+1
  797.          Address YAM 'getfolderinfo number'
  798.          finfo.idx=result
  799.          Address YAM 'getfolderinfo name'
  800.          finfo.idx.1=result
  801.          /* say 'i='i 'idx='idx 'folder number='finfo.idx 'name='finfo.idx.1 */
  802.          Address YAM 'getfolderinfo path'
  803.          finfo.idx.1.1=result
  804.          Address YAM 'getfolderinfo max'
  805.          finfo.idx.1.1.1=result
  806.          emptycnt=0
  807.       end
  808.       else do
  809.        /*  say 'i='i 'idx='idx 'sfrc='sfrc 'emptycnt='emptycnt */
  810.          emptycnt=emptycnt+1
  811.          if emptycnt>=emptymax then leave i
  812.       end
  813.    end
  814.    finfo.0=idx
  815.    Address YAM 'setfolder ' origfolder
  816.  
  817. Return
  818.  
  819. /******************************************************************************/
  820. /*                      Read Config File                                      */
  821. /* If the config file is not found then use internal defaults, force user to  */
  822. /* config page, and pop up message to edit and save. If the default config    */
  823. /* file is found then use it and scan archive list. Save the name as a var    */
  824. /* whenever a new file is loaded for reference by future SAVE,RELOAD cmds.    */
  825. /*                                                                            */
  826. /******************************************************************************/
  827. LoadConfig:
  828.  
  829.    if debug then say 'entered LoadConfig parm='parm
  830.  
  831.    if parm='' then configfile='YAM:REXX/YamTools.config'
  832.               else configfile=parm 
  833.  
  834.    setvar YAMTOOLSCONFIG configfile
  835.  
  836.    config.=missing
  837.    config.0=0
  838.    goodconfig=TRUE
  839.    maildir=missing
  840.    scanprog=missing
  841.    qsortprog=missing
  842.    brows=missing
  843.    bcols=missing
  844.  
  845.    goodopen=open('IN',configfile,'R')
  846.    if goodopen then do 
  847.       linein=readln('IN')
  848.       if linein~=configheader then do
  849.          infomsg='This is NOT a YamTools Configuration File\nSelect one that is:)'
  850.          Call InfoMsg
  851.          result=close('IN')
  852.          goodconfig=FALSE
  853.          getvar OLDYTCONFIG 
  854.          configfile=result
  855.          setvar YAMTOOLSCONFIG configfile
  856.          signal LoadConfigEnd
  857.       end
  858.       do until eof('IN')
  859.          linein=readln('IN')
  860.          linein=strip(linein)
  861.          select 
  862.             when substr(linein,1,2)='/*' then iterate
  863.             when linein='' then iterate
  864.             when upper(word(linein,1))='BROWS' then Brows=word(linein,2)
  865.             when upper(word(linein,1))='BCOLS' then Bcols=word(linein,2)
  866.             when upper(word(linein,1))='MAILDIR' then maildir=word(linein,2)
  867.             when upper(word(linein,1))='SCANPROG' then scanprog=word(linein,2)
  868.             when upper(word(linein,1))='QSORTPROG' then qsortprog=word(linein,2)
  869.             otherwise do
  870.                config.0=1+config.0
  871.                cptr=config.0
  872.                parse var linein config.cptr ',' config.cptr.1 ',' config.cptr.1.1 
  873.             end
  874.          end
  875.       end
  876.       result=close('IN')
  877.    end
  878.    else do 
  879.       Brows=3
  880.       Bcols=6
  881.       maildir='YAM:'
  882.       scanprog='C:FlashFind'
  883.       qsortprog='SYS:Rexxc/QuickSort'
  884.       Call BuildWindow
  885.       text   ID MDIR LABEL   maildir
  886.       popasl ID CFGM CONTENT maildir
  887.       popasl ID CFGF CONTENT scanprog
  888.       popasl ID CFGQ CONTENT qsortprog
  889.       do i=0 to (Brows*Bcols)-1
  890.          list ID CLST INSERT POS MUIV_List_Insert_Bottom STRING emptyconfig
  891.       end 
  892.       list ID CLST POS MUIV_List_Insert_Top STRING emptyconfig
  893.       goodconfig=FALSE
  894.       signal LoadConfigEnd
  895.    end
  896.  
  897.    if Brows=missing then Brows=3
  898.    if Bcols=missing then Bcols=6
  899.  
  900.    Call BuildWindow
  901.  
  902.    if maildir=missing then do
  903.       maildir='YAM:'
  904.       text   ID MDIR LABEL   maildir
  905.       popasl ID CFGM CONTENT maildir     
  906.       goodconfig=FALSE
  907.       signal LoadConfigEnd
  908.    end   
  909.    else do
  910.       text   ID MDIR LABEL   maildir
  911.       popasl ID CFGM CONTENT maildir     
  912.    end
  913.  
  914.    if scanprog=missing then do
  915.       scanprog='C:FlashFind'
  916.       popasl ID CFGF CONTENT scanprog
  917.       goodconfig=FALSE
  918.       signal LoadConfigEnd
  919.    end
  920.    else do
  921.       popasl ID CFGF CONTENT scanprog
  922.    end
  923.  
  924.    if qsortprog=missing then do
  925.       qsortprog='SYS:Rexxc/QuickSort'
  926.       popasl ID CFGQ CONTENT qsortprog
  927.       goodconfig=FALSE
  928.       signal LoadConfigEnd
  929.    end
  930.    else do
  931.       popasl ID CFGQ CONTENT qsortprog
  932.    end
  933.  
  934.    do i=1 to config.0
  935.       if i> Brows*Bcols then do
  936.          infomsg='Too Many Button Entries in 'configfile '\nSome buttons may be lost'
  937.          Call InfoMsg 
  938.          goodconfig=FALSE
  939.          signal LoadConfigEnd
  940.       end
  941.       j=i-1
  942.       liststr=config.i||comma||config.i.1||comma||config.i.1.1
  943.       list ID CLST POS j STRING liststr         
  944.       bname=config.i
  945.       if bname='empty' then bname='' 
  946.       bnum='B'||right(i,2,'0')
  947.       button ID bnum LABEL bname
  948.    end 
  949.  
  950.    k=i                                      /* copy counter               */
  951.    do i=k to Brows*Bcols                    /* fill any empty slots       */
  952.       j=i-1
  953.       list ID CLST INSERT POS j STRING emptyconfig
  954.    end
  955.  
  956.    list ID CLST POS MUIV_List_Insert_Top
  957.    liststr=result
  958.    list ID CLST POS MUIV_List_Insert_Top STRING liststr
  959.  
  960. LoadConfigEnd:
  961.  
  962. Return
  963.  
  964. /******************************************************************************/
  965. /*                      Edit Config Options                                   */
  966. /*                                                                            */
  967. /* Handle changing of ARexx command buttons, mail directory, flashfind, and   */
  968. /* qsort locations. Process SAVE,USE,RELOAD,CLEAR and a single level of UNDO. */
  969. /*                                                                            */
  970. /******************************************************************************/
  971. ConfigEdit:
  972.  
  973.    if debug then say 'entered ConfigEdit'
  974.    if debug then say 'parm='parm
  975.  
  976.    list ID CLST MUIA_List_Active
  977.    cpos=result
  978.    if debug then say 'cpos='cpos
  979.  
  980.    string ID CFG1
  981.    cfgS1=result
  982.    
  983.    cycle ID CFG2
  984.    cfgS2=result
  985.  
  986.    popasl ID CFG3
  987.    cfgS3=result
  988.  
  989.    select
  990.       when parm='UPDATE' then do
  991.         liststr=cfgS1||comma||cfgS2||comma||cfgS3
  992.         list ID CLST POS cpos STRING liststr
  993.       end 
  994.       when parm='EDIT' then do
  995.          parse var rest oldcfgS1 ',' oldcfgS2 ',' oldcfgS3
  996.          oldcfgS1=strip(oldcfgS1)
  997.          oldcfgS2=strip(oldcfgS2)
  998.          oldcfgS3=strip(oldcfgS3)
  999.          liststr='"'||oldcfgS1||comma||oldcfgS2||comma||oldcfgs3||'"'
  1000.          setvar ytoldcfg liststr
  1001.          if substr(oldcfgS1,1,5)='empty' then oldcfgs1=''
  1002.          string ID CFG1 CONTENT oldcfgS1 
  1003.          if oldcfgS2='none' then oldcfgs2=''
  1004.          cycle ID CFG2 LABELS oldcfgS2 
  1005.          if pos('--available--',oldcfgS3)>0 then oldcfgS3='YAM:rexx'
  1006.          popasl ID CFG3 CONTENT oldcfgS3
  1007.       end
  1008.       when parm='CLEAR' then do
  1009.         list ID CLST POS cpos STRING emptyconfig
  1010.       end 
  1011.       when parm='USE' then do
  1012.            Call ValidateConfig
  1013.            Call UpdateButtons
  1014.            Call EnsureLibs
  1015.       end 
  1016.       when parm='SAVE' then do
  1017.            Call ValidateConfig
  1018.            Call UpdateButtons
  1019.            Call SaveConfig
  1020.            Call EnsureLibs
  1021.       end 
  1022.       when parm='SAVEAS' then do
  1023.            Call AskConfig
  1024.            Call ValidateConfig
  1025.            Call UpdateButtons
  1026.            Call SaveConfig
  1027.            Call EnsureLibs
  1028.       end 
  1029.       when parm='RELOAD' then do
  1030.            getvar YAMTOOLSCONFIG 
  1031.            parm=result   
  1032.            Call LoadConfig
  1033.            Call ValidateConfig
  1034.            Call EnsureLibs
  1035.       end 
  1036.       when parm='READ' then do
  1037.            Call AskConfig
  1038.            getvar YAMTOOLSCONFIG 
  1039.            parm=result   
  1040.            Call LoadConfig
  1041.            Call ValidateConfig
  1042.            Call EnsureLibs
  1043.       end 
  1044.       when parm='UNDO' then do
  1045.          getvar ytoldcfg
  1046.          oldcfg=result
  1047.          parse var oldcfg oldcfgS1 ',' oldcfgS2 ',' oldcfgS3
  1048.          liststr=oldcfgS1||comma||oldcfgS2||comma||oldcfgS3
  1049.          list ID CLST POS cpos STRING liststr
  1050.       end 
  1051.       otherwise do
  1052.          if debug then say 'otherwise in CONFIGEDIT'
  1053.       end
  1054.    end  
  1055.  
  1056. Return
  1057.  
  1058. /******************************************************************************/
  1059. /*                                                                            */
  1060. /* Ask user for name of configuration file to either READ or SAVEAS           */
  1061. /*                                                                            */
  1062. /******************************************************************************/
  1063. AskConfig:   
  1064.  
  1065.    getvar YAMTOOLSCONFIG 
  1066.    configfile=result   
  1067.    setvar OLDYTCONFIG configfile
  1068.  
  1069.    select
  1070.       when lastpos('/',configfile)>0 then do
  1071.          figfile=substr(configfile,lastpos('/',configfile)+1)
  1072.          figdir=substr(configfile,1,lastpos('/',configfile)-1)
  1073.       end
  1074.       when lastpos(':',configfile)>0 then do
  1075.          figfile=substr(configfile,lastpos(':',configfile)+1)
  1076.          figdir=substr(configfile,1,lastpos(':',configfile)-1)
  1077.       end
  1078.       otherwise do
  1079.          figfile='YamTools.config'
  1080.          figdir='YAM:rexx'
  1081.       end
  1082.    end
  1083.  
  1084.    aslrequest ID YTWIN TITLE '"Select File"',
  1085.               ATTRS ASLFR_InitialDrawer figdir ASLFR_InitialFile figfile 
  1086.    if rc = 0 then do
  1087.       configfile=result
  1088.       setvar YAMTOOLSCONFIG configfile
  1089.       if debug then say 'Configfile from ASLFR='configfile
  1090.    end
  1091.  
  1092.  
  1093. Return
  1094.  
  1095. /******************************************************************************/
  1096. /*                                                                            */
  1097. /* SAVE configuration file to file pointed at by the MuiRexx YAMTOOLSCONFIG   */
  1098. /* variable. Very simple format for config file.                              */
  1099. /*                                                                            */
  1100. /******************************************************************************/
  1101. SaveConfig:   
  1102.  
  1103.    list ID CLST MUIA_List_Active
  1104.    cpos=result
  1105.  
  1106.    getvar YAMTOOLSCONFIG 
  1107.    configfile=result   
  1108.  
  1109.    goodopen=open('OUT',configfile,'W')
  1110.    if goodopen then do 
  1111.       foo=writeln('OUT',configheader)
  1112.       popasl ID CFGM
  1113.       maildir=result
  1114.       text   ID MDIR LABEL   maildir
  1115.       liststr='MAILDIR'||' '||maildir
  1116.       foo=writeln('OUT',liststr)       
  1117.       popasl ID CFGF 
  1118.       scanprog=result
  1119.       liststr='SCANPROG'||' '||scanprog
  1120.       foo=writeln('OUT',liststr)       
  1121.       popasl ID CFGQ
  1122.       qsortprog=result
  1123.       liststr='QSORTPROG'||' '||qsortprog
  1124.       foo=writeln('OUT',liststr)       
  1125.       popslider ID CFGR
  1126.       xrows=result
  1127.       liststr='BROWS'||' '||xrows
  1128.       foo=writeln('OUT',liststr)       
  1129.       popslider ID CFGC
  1130.       xcols=result
  1131.       liststr='BCOLS'||' '||xcols
  1132.       foo=writeln('OUT',liststr)       
  1133.       do i=0 to (Brows*Bcols)-1
  1134.          j=i+1
  1135.          list ID CLST POS i
  1136.          oldcfg=result
  1137.          parse var oldcfg oldcfgS1 ',' oldcfgS2 ',' oldcfgS3
  1138.          liststr=oldcfgS1||comma||oldcfgS2||comma||oldcfgS3
  1139.          foo=writeln('OUT',liststr)
  1140.       end
  1141.       result=close('OUT')
  1142.    end
  1143.    else do
  1144.       errmsg='Unable to open Config file for output'
  1145.       Call ErrorMsg 
  1146.    end
  1147.  
  1148.    list ID CLST POS cpos
  1149.  
  1150. Return
  1151.  
  1152. /******************************************************************************/
  1153. /*                                                                            */
  1154. /* Validate ALL of the Configuration information.                             */
  1155. /*                                                                            */
  1156. /******************************************************************************/
  1157. ValidateConfig:
  1158.  
  1159.    popasl ID CFGM
  1160.    maildir=result
  1161.     if right(maildir,1)='/' then do
  1162.         maildir=substr(maildir,1,length(maildir)-1)
  1163.     end
  1164.  
  1165.    if ~exists(maildir) then do
  1166.       goodconfig=FALSE
  1167.       errmsg='"Mail directory: "'||maildir||" does not exist"
  1168.       Call Errormsg
  1169.    end
  1170.    text   ID MDIR LABEL   maildir
  1171.     popasl ID CFGM CONTENT maildir 
  1172.  
  1173.    popasl ID CFGF 
  1174.    scanprog=result
  1175.    if ~exists(scanprog) then do
  1176.       goodconfig=FALSE
  1177.       errmsg='"Scan program: "'||scanprog||" does not exist"
  1178.       Call Errormsg
  1179.    end
  1180.    
  1181.    popasl ID CFGQ
  1182.    qsortprog=result
  1183.    if ~exists(qsortprog) then do
  1184.       goodconfig=FALSE
  1185.       errmsg='"QuickSort program: "'||qsortprog||" does not exist"
  1186.       Call Errormsg
  1187.    end
  1188.  
  1189.    do i=0 to (Brows*Bcols)-1
  1190.       list ID CLST POS i
  1191.       oldcfg=result
  1192.       parse var oldcfg blabel ',' ptype ',' rexxprog
  1193.       if blabel='empty' then iterate
  1194.       if ~exists(rexxprog) then do
  1195.          goodconfig=FALSE
  1196.          errmsg='"ARexx program: "'||rexxprog||" does not exist"
  1197.          Call Errormsg
  1198.       end
  1199.       if blabel='' then do
  1200.          goodconfig=FALSE
  1201.          errmsg='"Label is required for: "'||rexxprog
  1202.          Call Errormsg
  1203.       end
  1204.    end
  1205.  
  1206. Return
  1207.  
  1208. /******************************************************************************/
  1209. /*                                                                            */
  1210. /* Update the labels on the ARexx command buttons to match the current config.*/
  1211. /*                                                                            */
  1212. /******************************************************************************/
  1213. UpdateButtons:
  1214.  
  1215.    list ID CLST MUIA_List_Active
  1216.    cpos=result
  1217.  
  1218.    do i=0 to (Brows*Bcols)-1
  1219.       j=i+1
  1220.       list ID CLST POS i
  1221.       liststr=result
  1222.       parse var liststr blabel ',' rest
  1223.       if blabel='empty' then blabel=''
  1224.       bid='B'||right(j,2,'0')
  1225.       button ID bid LABEL blabel
  1226.    end
  1227.  
  1228.    list ID CLST POS cpos
  1229.  
  1230. Return
  1231.  
  1232. /******************************************************************************/
  1233. /*                                                                            */
  1234. /* Load the Folder List on page 1 of the YAMTOOLS window.                     */
  1235. /*                                                                            */
  1236. /******************************************************************************/
  1237. LoadArchList:
  1238.  
  1239.    do i=1 to finfo.0
  1240.       liststr=finfo.i.1||comma||finfo.i.1.1.1||comma||finfo.i.1.1||comma||finfo.i
  1241.       list ID ALST INSERT POS MUIV_List_Insert_Bottom STRING liststr
  1242.    end
  1243.  
  1244. Return
  1245.  
  1246. /******************************************************************************/
  1247. /*                                                                            */
  1248. /* Clear all entries in the Folder List.                                      */
  1249. /*                                                                            */
  1250. /******************************************************************************/
  1251. ClrArchList:
  1252.  
  1253.    list ID ALST ATTRS MUIA_List_Entries
  1254.    acnt=result
  1255.  
  1256.    do i=1 to acnt
  1257.       list ID ALST POS MUIV_List_Insert_Top STRING
  1258.    end
  1259.  
  1260. Return
  1261.  
  1262. /******************************************************************************/
  1263. /*                                                                            */
  1264. /* Uncheck ALL if ANY of the others are set to ON. Unset others if user turns */
  1265. /* on the ALL lines option.                                                   */
  1266. /*                                                                            */
  1267. /******************************************************************************/
  1268. SetAllCheck:
  1269.  
  1270.    check ID parm
  1271.    status=result
  1272.    if status then do
  1273.       Select
  1274.          when parm='SRCA' then do
  1275.             check ID SRCS ATTRS MUIA_Selected FALSE
  1276.             check ID SRCF ATTRS MUIA_Selected FALSE
  1277.             check ID SRCT ATTRS MUIA_Selected FALSE
  1278.             check ID SRCM ATTRS MUIA_Selected FALSE
  1279.          end
  1280.          otherwise do
  1281.             check ID SRCA ATTRS MUIA_Selected FALSE
  1282.          end 
  1283.       end 
  1284.    end
  1285.  
  1286. Return
  1287.  
  1288. /******************************************************************************/
  1289. /*  Create mail list of all mail in folder.                                   */
  1290. /******************************************************************************/
  1291. ListMail:
  1292.  
  1293.    if debug then say 'Entered ListMail:'
  1294.    aline=parm||rest
  1295.    if debug then say aline
  1296.    parse var aline arch ',' size ',' afile ',' anum ',' rest
  1297.    if debug then say '  arch='arch 
  1298.    if debug then say '  size='size
  1299.    if debug then say '  anum='anum 
  1300.    if debug then say '  afile='afile
  1301.    Address YAM "setfolder" anum
  1302.    Address YAM "getfolderinfo max"
  1303.    size=result
  1304.  
  1305.    list ID MLST ATTRS MUIA_List_Entries
  1306.    mcnt=result
  1307.    if debug then say 'mcnt='mcnt
  1308.  
  1309.    if debug then say 'Clearing Mail List '
  1310.    
  1311.    infotitle='"YAM Tools Search"'
  1312.    infotext="Loading Mail list..."
  1313.    infobuttons='"Continue,Interrupt,Abort"'
  1314.    showbusy=TRUE
  1315.  
  1316.    Call InfoWindow
  1317.  
  1318.    do i=1 to mcnt
  1319.       list ID MLST POS MUIV_List_Insert_Top STRING
  1320.    end
  1321.  
  1322.    do i=0 to size-1
  1323.       mnum=i
  1324.       Address YAM "setmail" mnum
  1325.       Address YAM "getmailinfo file"
  1326.       mpath=result
  1327.       file=substr(mpath,lastpos('/',mpath)+1)   /* just the filename part*/
  1328.       Address YAM "getmailinfo from"
  1329.       from=result
  1330.       if pos('<',from)>1 then from=substr(from,1,pos('<',from)-1)
  1331.       from=translate(from,' ',',')
  1332.       Address YAM "getmailinfo subject"
  1333.       subj=result
  1334.       subj=translate(subj,' ',',') 
  1335.       Address YAM "getmailinfo to"
  1336.       mfor=result
  1337.       mfor=translate(mfor,' ',',')
  1338.       liststr=arch||comma||from||comma||subj||comma||mfor||comma||mnum||comma||anum||comma||file
  1339.       if debug then say liststr
  1340.       list ID MLST INSERT POS MUIV_List_Insert_Bottom STRING liststr
  1341.       radio ID SQUIT 
  1342.       squitopt=result
  1343.       select
  1344.          when squitopt="Interrupt" then leave i
  1345.          when squitopt="Abort" then do
  1346.             signal ListMailEnd
  1347.          end
  1348.          otherwise nop
  1349.       end
  1350.    end
  1351.  
  1352.    group ID YTPGS LABELS '"Mail List"'
  1353.  
  1354. ListMailEnd:
  1355.  
  1356.    window ID YTINF CLOSE   
  1357.  
  1358. Return
  1359. /******************************************************************************/
  1360. /*  Read mail the user selected.                                              */
  1361. /******************************************************************************/
  1362. ReadMail:
  1363.    
  1364.    if debug then say 'Entered ReadMail:'
  1365.    mline=parm||rest
  1366.    if debug then say mline
  1367.    parse var mline arch ',' from ',' subject ',' mfor ','mnum ',' anum ',' file
  1368.    Address YAM "setfolder" anum
  1369.    Address YAM "setmail" mnum
  1370.    Address YAM "getmailinfo file"
  1371.    mpath=result
  1372.    if debug then say 'mpath='mpath
  1373.    if debug then say 'file='file
  1374.    if pos(file,mpath)=0 then do
  1375.       infotext='Order of mail in folder has changed\nSearching for mail...'
  1376.       showbusy=TRUE
  1377.       infobuttons=""
  1378.       Call InfoWindow
  1379.       Address YAM "getfolderinfo max"
  1380.       mcnt=result
  1381.       do i=0 to mcnt-1
  1382.          Address YAM "setmail" i
  1383.          Address YAM "getmailinfo file"
  1384.          mpath=result
  1385.          if pos(file,mpath)~=0 then do
  1386.             window ID YTINF CLOSE
  1387.             leave i
  1388.          end
  1389.          else mpath=missing
  1390.       end
  1391.    end
  1392.  
  1393.    if mpath~=missing then do
  1394.       Address Command "sys:Utilities/multiview " mpath "PUBSCREEN="screen
  1395.       /*   Address YAM "mailreply"     */
  1396.    end
  1397.    else do
  1398.       window ID YTINF CLOSE
  1399.       errmsg="This mail has been moved or deleted"
  1400.       Call ErrorMsg
  1401.    end
  1402.  
  1403. Return
  1404.  
  1405. /******************************************************************************/
  1406. /*                                                                            */
  1407. /* Determine loop control and then invoke the specified command for each of   */
  1408. /* folders, directories, mail, or filenames as appropriate.                   */
  1409. /* 2/26/97 Added execute ONCE option. Passes NO information just Calls.       */
  1410. /*                                                                            */
  1411. /******************************************************************************/
  1412. DoRexxButton:
  1413.  
  1414.    butid='B'||parm 
  1415.    list ID CLST POS parm-1
  1416.    cmdline=result
  1417.    if debug then say 'Entered DoRexxButton'
  1418.    if debug then say 'cmdline='cmdline
  1419.  
  1420.    parse var cmdline blabel ',' btype ',' bcommand
  1421.         
  1422.    group ID YTPGS REGISTER
  1423.    pagename=result
  1424.  
  1425.    select 
  1426.       when pagename='Config' then do
  1427.          errmsg='Cannot Execute Buttons from Config Window'
  1428.          Call ErrorMsg
  1429.       end
  1430.         when upper(btype)='ONCE' then do
  1431.          intcommand="Call '"bcommand"'"
  1432.          if debug then say 'intcommand='intcommand
  1433.          interpret intcommand
  1434.       end
  1435.       when pagename='Mail List' then do
  1436.          if upper(btype)='FOLDER' then do
  1437.             errmsg='This command needs to be run from the folder list'
  1438.             signal ErrorMsg
  1439.          end                
  1440.          else do
  1441.             list ID MLST ATTRS MUIA_List_Entries
  1442.             mcnt=result
  1443.             if debug then say 'mcnt='mcnt
  1444.             infotext="\n\n      Starting to process entries      \n\n"
  1445.             showbusy=TRUE
  1446.             infobuttons='"Continue,Abort"'
  1447.             Call InfoWindow
  1448.             do msel=0 to mcnt
  1449.                list ID MLST
  1450.                mline=result
  1451.                if mline='' then leave msel
  1452.                parse var mline arch ',' from ',' subj ',' mfor ',' mnum ',' anum ',' file
  1453.                if debug then say 'mline='mline
  1454.                Address YAM "setfolder" anum
  1455.                Address YAM "setmail" mnum
  1456.                Address YAM "getmailinfo file"
  1457.                mpath=result
  1458.                infotext="Processing Folder "||arch||"\nMail entry "||mnum+1
  1459.                 text ID STEXT LABEL infotext
  1460.                if pos(file,mpath)=0 then do
  1461.                   infotext="Order of mail in folder has changed\nSearching for mail..."
  1462.                     text ID STEXT LABEL infotext
  1463.                   Address YAM "getfolderinfo max"
  1464.                   xmcnt=result
  1465.                   do i=0 to xmcnt-1
  1466.                      Address YAM "setmail" i
  1467.                      Address YAM "getmailinfo file"
  1468.                      mpath=result
  1469.                      if pos(file,mpath)~=0 then do
  1470.                         leave i
  1471.                      end
  1472.                      else mpath=missing
  1473.                   end
  1474.                end
  1475.                if mpath~=missing then do
  1476.                   intcommand="Call '"bcommand"' '"mpath"'"
  1477.                   if debug then say 'intcommand='intcommand
  1478.                   interpret intcommand
  1479.                end
  1480.                else do
  1481.                   infotext="Mail has been deleted or moved\nContinuing with others"
  1482.                     text ID STEXT LABEL infotext
  1483.                end
  1484.                radio ID SQUIT 
  1485.                squitopt=result
  1486.                if squitopt="Abort" then leave msel
  1487.             end
  1488.             window ID YTINF CLOSE
  1489.          end
  1490.       end
  1491.       when pagename='Folder List' then do
  1492.          list ID ALST ATTRS MUIA_List_Entries
  1493.          acnt=result
  1494.          infotext="\n\n      Starting to process entries      \n\n"
  1495.          showbusy=TRUE
  1496.          infobuttons='"Continue,Abort"'
  1497.          Call InfoWindow
  1498.          do asel=0 to acnt
  1499.             list ID ALST
  1500.             aline=result
  1501.             if aline='' then leave asel
  1502.             parse var aline arch ',' size ',' file ',' anum ',' rest
  1503.             if debug then say 'aline='aline
  1504.                 if size=0 then iterate asel
  1505.             Address YAM "setfolder" anum
  1506.             if upper(btype)='FOLDER' then do
  1507.                Address YAM "setmail 0"
  1508.                infotext="Processing Folder "||arch
  1509.                 text ID STEXT LABEL infotext
  1510.                intcommand="Call '"bcommand"' '"file"'"
  1511.                if debug then say 'intcommand='intcommand
  1512.                interpret intcommand
  1513.                radio ID SQUIT 
  1514.                squitopt=result
  1515.                if squitopt="Abort" then leave asel
  1516.             end
  1517.             else do
  1518.                Address YAM "getfolderinfo max"
  1519.                mcnt=result
  1520.                do mnum=0 to mcnt-1
  1521.                   Address YAM "setmail" mnum
  1522.                   Address YAM "getmailinfo file"
  1523.                   mpath=result
  1524.                    infotext="Processing Folder "||arch||"\nMail entry "||mnum+1||"/"||mcnt
  1525.                     text ID STEXT LABEL infotext
  1526.                   intcommand="Call '"bcommand"' '"mpath"'"
  1527.                   if debug then say 'intcommand='intcommand
  1528.                   interpret intcommand
  1529.                   radio ID SQUIT 
  1530.                   squitopt=result
  1531.                   if squitopt="Abort" then leave asel
  1532.                end
  1533.             end
  1534.          end
  1535.          window ID YTINF CLOSE
  1536.       end
  1537.       otherwise do
  1538.          infomsg= 'Found otherwise in DoRexxButton'
  1539.          Call InfoMsg
  1540.       end
  1541.    end       
  1542.  
  1543. Return
  1544.  
  1545. /******************************************************************************/
  1546. /*   Get information from main search screen, scan files for search strings   */
  1547. /*   Build screen list of mail that matches criteria                          */
  1548. /******************************************************************************/
  1549. SearchArchs:
  1550.  
  1551.    ADDRESS YAMTOOLS
  1552.  
  1553.    popasl ID CFGM
  1554.    maildir=result
  1555.  
  1556.    popasl ID CFGF 
  1557.    scanprog=result
  1558.  
  1559.    popasl ID CFGQ
  1560.    qsortprog=result
  1561.  
  1562.     tmpfile="T:ytsearch."||timestamp
  1563.    timerfile="T:ytwait."||timestamp
  1564.  
  1565.     sptr=0 
  1566.    srchstr.=missing
  1567.    srchstr.0=0
  1568.  
  1569.    Archlist.=missing
  1570.    Archlist.0=0
  1571.  
  1572.    Matches.=missing
  1573.    Matches.0=0
  1574.  
  1575.    string ID SRC1
  1576.    sval=result
  1577.     if sval~='' & sval~='RESULT' then do
  1578.        srchstr.0=1+srchstr.0
  1579.        sptr=srchstr.0
  1580.       srchstr.sptr=sval
  1581.       srchstr.sptr.1=0
  1582.       if debug then say srchstr.0 'search string:' srchstr.sptr
  1583.    end
  1584.    
  1585.    string ID SRC2
  1586.    sval=result
  1587.    if sval~='' & sval~='RESULT' then do
  1588.       srchstr.0=1+srchstr.0
  1589.       sptr=srchstr.0
  1590.       srchstr.sptr=sval
  1591.       srchstr.sptr.1=0
  1592.       if debug then say srchstr.0 'search string:' srchstr.sptr
  1593.    end
  1594.    
  1595.    string ID SRC3
  1596.    sval=result
  1597.    if sval~='' & sval~='RESULT' then do
  1598.       srchstr.0=1+srchstr.0
  1599.       sptr=srchstr.0
  1600.        srchstr.sptr=sval
  1601.       srchstr.sptr.1=0
  1602.       if debug then say srchstr.0 'search string:' srchstr.sptr
  1603.     end
  1604.  
  1605.    if sptr=0 then do
  1606.       errmsg="Specify SEARCH strings"
  1607.       Call ErrorMsg
  1608.    end
  1609.  
  1610.    check ID SRCS
  1611.    srchsubj=result
  1612.    check ID SRCF
  1613.    srchfrom=result
  1614.    check ID SRCT
  1615.    srchto=result
  1616.    check ID SRCM
  1617.    srchmsg=result
  1618.    check ID SRCA
  1619.    srchall=result
  1620.    radio ID SLOG
  1621.    matchlogic=result
  1622.    
  1623.     if matchlogic='Match Any' then matchreqs=1
  1624.                               else matchreqs=srchstr.0 
  1625.     
  1626.    list ID ALST ATTRS MUIA_List_Entries
  1627.    acnt=result
  1628.    if debug then say 'acnt='acnt
  1629.    
  1630.    list ID MLST ATTRS MUIA_List_Entries
  1631.    mcnt=result
  1632.    if debug then say 'mcnt='mcnt
  1633.  
  1634.    if debug then say 'Clearing Mail List '
  1635.    
  1636.    do i=1 to mcnt
  1637.       list ID MLST POS MUIV_List_Insert_Top STRING
  1638.    end
  1639.  
  1640.    button ID SRCX PORT YAMTOOLS ATTRS MUIA_Disabled TRUE
  1641.  
  1642.    infotitle='"YAM Tools Search"'
  1643.    infotext="Starting to Search Folders"
  1644.    infobuttons='"Continue,Interrupt,Abort"'
  1645.    showbusy=TRUE
  1646.  
  1647.    Call InfoWindow
  1648.  
  1649.    do asel=0 to acnt
  1650.       list ID ALST
  1651.       aline=result
  1652.       if aline='' then break
  1653.       parse var aline arch ',' size ',' file ',' anum ',' rest
  1654.       text ID STEXT LABEL "Scanning: "arch
  1655.       if debug then say 'Call SearchArchive for:' aline
  1656.       if size > 0 then Call SearchArchive
  1657.       archcnt=asel+1 
  1658.       Archlist.0=archcnt
  1659.       Archlist.archcnt=arch
  1660.       Archlist.archcnt.1=anum
  1661.       Archlist.archcnt.1.1=file
  1662.       radio ID SQUIT 
  1663.       squitopt=result
  1664.       select
  1665.          when squitopt="Interrupt" then leave asel
  1666.          when squitopt="Abort" then do
  1667.             signal SearchArchsEnd
  1668.          end
  1669.          otherwise nop
  1670.       end
  1671.    end
  1672.  
  1673.    if exists(timerfile) then do
  1674.       if ~debug then do
  1675.          Address Command 'Delete ' timerfile 'Quiet'
  1676.       end
  1677.    end   
  1678.  
  1679.    if asel=0 then do
  1680.       errmsg="Select Folders to Search"
  1681.       Call ReEnableSearch
  1682.       Call ErrorMsg
  1683.    end
  1684.  
  1685.    Call DoScanFile
  1686.  
  1687.    radio ID SQUIT 
  1688.    if result~="Continue" then do
  1689.       Call ReEnableSearch
  1690.       errmsg="Search Interrupted/Aborted"
  1691.       Call ErrorMsg
  1692.    end
  1693.  
  1694.    list ID MLST INSERT POS MUIV_List_Insert_Bottom ATTRS MUIA_List_Quiet TRUE
  1695.  
  1696.    if debug then say 'starting match archlist to matches'
  1697.    if Matches.0=0 then do
  1698.       errmsg="No Matches Found"
  1699.       Call ReEnableSearch
  1700.       Call ErrorMsg
  1701.    end
  1702.    do i=1 to Archlist.0
  1703.       do j=1 to Matches.0
  1704.          if upper(Matches.j.1)=upper(Archlist.i.1.1) then do
  1705.             Matches.j=Archlist.i
  1706.             Matches.j.1.1.1=Archlist.i.1
  1707.          end
  1708.       end
  1709.    end
  1710.  
  1711. /**************************************************************************/
  1712. /*            Match of scan results to mail within each folder            */
  1713. /*                                                                        */
  1714. /* If only 1 match is found in a given folder then we just loop thru the  */
  1715. /* mail until we find the matching filename. If there is more than 1 in   */
  1716. /* a specific folder then we loop thru the folder, build an array of info */
  1717. /* and then do our matching against the array. This speeds the process up */
  1718. /* for both conditions.  Remove commas from From:,To:, and Subject:       */
  1719. /**************************************************************************/
  1720.  
  1721.    if debug then say "Doing getmailinfo for i=1 to " Matches.0
  1722.    oldfolder=missing
  1723.    do i=1 to Matches.0
  1724.       fptr=i+1
  1725.       if matches.fptr.1.1.1=missing & matches.i.1.1.1=oldfolder then leave i
  1726.       if debug then say 'i='i 'matches.0='matches.0
  1727.       radio ID SQUIT 
  1728.       if result~="Continue" then leave i
  1729.       Address YAM "setfolder" matches.i.1.1.1
  1730.       Address YAM "getfolderinfo max"
  1731.       mailcnt=result
  1732.       if debug then say 'current/next folders' matches.i.1.1.1 matches.fptr.1.1.1
  1733.       if matches.fptr.1.1.1~=matches.i.1.1.1 then do
  1734.          do j=0 to mailcnt-1
  1735.             Address YAM "setmail" j
  1736.             Address YAM "getmailinfo file"
  1737.             mpath=result         
  1738.             if pos(matches.i.1.1,mpath)>0 then do
  1739.                matches.i.1.1.1.1=j                              /* number */
  1740.                Address YAM "getmailinfo from"
  1741.                from=result
  1742.                if pos('<',from)>1 then from=substr(from,1,pos('<',from)-1)
  1743.                matches.i.1.1.1.1.1=translate(from,' ',',')      /*from    */
  1744.                Address YAM "getmailinfo subject"
  1745.                subject=result
  1746.                matches.i.1.1.1.1.1.1=translate(subject,' ',',') /*subject */
  1747.                Address YAM "getmailinfo to"
  1748.                to=result
  1749.                matches.i.1.1.1.1.1.1.1=translate(to,' ',',')    /* To:    */
  1750.                iterate i
  1751.             end
  1752.          end
  1753.       end
  1754.       else do
  1755.          oldptr=i
  1756.          oldfolder=matches.i.1.1.1
  1757.          tempmail.=missing
  1758.          tempmail.0=0
  1759.          if debug then say 'oldptr='oldptr 'oldfolder=oldfolder'
  1760.          do j=0 to mailcnt-1
  1761.             k=j+1
  1762.             tempmail.0=k
  1763.             Address YAM "setmail" j
  1764.             Address YAM "getmailinfo file"
  1765.             tempmail.k=result
  1766.          end 
  1767.          do newptr=oldptr to matches.0
  1768.             i=newptr-1
  1769.             if debug then say 'i='i 'newptr='newptr 'current='matches.newptr.1.1.1 'oldfolder='oldfolder
  1770.             if matches.newptr.1.1.1~=oldfolder then iterate i
  1771.             do j=1 to tempmail.0
  1772.                if pos(matches.newptr.1.1,tempmail.j)>0 then do   
  1773.                   matches.newptr.1.1.1.1=j-1                    /* number */
  1774.                   Address YAM "setmail" j-1
  1775.                   Address YAM "getmailinfo from"
  1776.                   from=result
  1777.                   if pos('<',from)>1 then from=substr(from,1,pos('<',from)-1)
  1778.                   matches.newptr.1.1.1.1.1=translate(from,' ',',')
  1779.                   Address YAM "getmailinfo subject"
  1780.                   subject=result
  1781.                   matches.newptr.1.1.1.1.1.1=translate(subject,' ',',') 
  1782.                   Address YAM "getmailinfo to"
  1783.                   to=result
  1784.                   matches.newptr.1.1.1.1.1.1.1=translate(to,' ',',')
  1785.                   iterate newptr
  1786.                end
  1787.             end
  1788.          end
  1789.       end
  1790.    end
  1791.  
  1792. /**************************************************************************/
  1793. /*   Build the Mail List and switch to the Mail List page.                */
  1794. /**************************************************************************/
  1795.  
  1796.    if debug then say 'Placing info in MLST'
  1797.     do i=1 to Matches.0
  1798.       arch=Matches.i
  1799.       path=Matches.i.1
  1800.       file=Matches.i.1.1
  1801.       anum=Matches.i.1.1.1
  1802.       mnum=Matches.i.1.1.1.1
  1803.       from=Matches.i.1.1.1.1.1
  1804.       subj=Matches.i.1.1.1.1.1.1      
  1805.       mfor=Matches.i.1.1.1.1.1.1.1      
  1806.       liststr=arch||comma||from||comma||subj||comma||mfor||comma||mnum||comma||anum||comma||file
  1807.       list ID MLST INSERT POS MUIV_List_Insert_Bottom STRING liststr
  1808.         if debug then say 'match file='file
  1809.         if debug then say 'match path='path
  1810.    end
  1811.    list ID MLST ATTRS MUIA_List_Quiet FALSE
  1812.  
  1813.    group ID YTPGS LABELS '"Mail List"'
  1814.  
  1815.    
  1816.  
  1817. SearchArchsEnd:
  1818. ReEnableSearch:
  1819.  
  1820.    window ID YTINF CLOSE   
  1821.  
  1822.    button ID SRCX HELP help.SRCX  NODE node.SRCX COMMAND '"YamTools.rexx SEARCH "', 
  1823.           PRESS ATTRS MUIA_CycleChain TRUE MUIA_Disabled FALSE,
  1824.           LABEL 'Search'
  1825.  
  1826. Return
  1827.  
  1828. /******************************************************************************/
  1829. /*                                                                            */
  1830. /******************************************************************************/
  1831. SearchArchive:
  1832.  
  1833.     sfile=file||'/'
  1834.       
  1835.    do j=1 to srchstr.0
  1836.       if debug then say 'starting 'scanprog sfile srchstr.j
  1837.       Address Command "run >nil: "scanprog sfile '"'srchstr.j'"' " NH NUM >>"tmpfile
  1838.       Call WaitScanDone
  1839.       if debug then say 'finished 'scanprog sfile srchstr.j
  1840.       radio ID SQUIT 
  1841.       if result~="Continue" then leave j     
  1842.    end
  1843.  
  1844. Return
  1845.    
  1846. /**************************************************************************/
  1847. /*                                                                        */
  1848. /* Scan files with output to a temp file. Read lines back into array.     */
  1849. /* Sort the array. Sorted array becomes input for further processing.     */
  1850. /*                                                                        */
  1851. /**************************************************************************/
  1852. DoScanFile:
  1853.  
  1854.    infotext="Building Match List..."
  1855.    text ID STEXT LABEL infotext
  1856.  
  1857.    ScanArray.=missing          /* stores parsed information from scan prg */
  1858.    ScanArray.0=0                            /* no scan lines yet          */
  1859.    sptr=0                                   /* counter for array          */     
  1860.  
  1861.    Matches.=missing                         /* array for matches          */
  1862.    Matches.0=0                              /* none yet                   */
  1863.    matchcnt=0                               /* used to determine matches  */
  1864.  
  1865.    olddir =missing                          /* level break controls       */
  1866.    oldfile=missing                          /* level break controls       */
  1867.  
  1868.    goodopen=open('IN',tmpfile,'R')
  1869.    if ~goodopen then do
  1870.       /* put user notification code/call here */
  1871.       exit
  1872.    end
  1873.  
  1874.    do until eof('IN')
  1875.       linein=readln('IN')
  1876.       select
  1877.          when words(linein)=2 & word(linein,2)='...' then do
  1878.             fullname=word(linein,1)              /* filename with path    */
  1879.             chop=lastpos('/',fullname)           /* start of filename     */
  1880.             filename=substr(fullname,chop+1)     /* just the filename part*/
  1881.             dirname=substr(fullname,1,chop-1)    /* path info             */
  1882.          end
  1883.          when words(linein) > 0 then do
  1884.             linenum=strip(word(linein,1))        /* line number found     */
  1885.             linenum=right(linenum,6,'0')         /* put in leading zeros  */
  1886.             text=subword(linein,2)               /* remaining string      */
  1887.             sptr=sptr+1                          /* increment cnter       */
  1888.             scanarray.0=sptr                     /* store it              */    
  1889.             scanarray.sptr=dirname filename linenum text /* store it      */
  1890.          end
  1891.          otherwise nop                           /* should be end of file */
  1892.       end
  1893.    end
  1894.  
  1895.    result=close('IN')                            /* close the scan file   */
  1896.  
  1897.    if ~debug then do
  1898.       Address Command 'Delete ' tmpfile 'quiet'  /* delete it             */
  1899.    end
  1900.  
  1901.    if show('L','rexxtricks.library') then do    /* use tricks library     */
  1902.       call QSORT(scanarray)                  /* sort by name, line number */
  1903.    end
  1904.    else do                                   /* use QuickSort format      */
  1905.       call QSORT(1, scanarray.0, scanarray)  /* sort by name, line number */
  1906.    end 
  1907.  
  1908.    do i=1 to scanarray.0
  1909.       dirname=word(scanarray.i,1)                /* directory in array    */
  1910.       filename=word(scanarray.i,2)               /* filename in array     */
  1911.       linenum=word(scanarray.i,3)                /* line number in array  */       
  1912.       text=subword(scanarray.i,4)                /* remainder of line     */
  1913.       if dirname~=olddir | filename~=oldfile then do
  1914.          Call TestMatch                          /* see if we use this one*/
  1915.       end
  1916.       type=word(text,1)                          /* header word ??        */
  1917.       if srchall=FALSE then do 
  1918.          Call FilterLines                        /* accept/reject lines   */      
  1919.          if skipline then iterate i
  1920.       end
  1921.       do j=1 to srchstr.0                        /* loop thru search vals */
  1922.          if pos(upper(srchstr.j),upper(text))>0 then do /* found match    */
  1923.             srchstr.j.1=1                        /* mark as found         */ 
  1924.          end
  1925.       end
  1926.    end                                  /* matches do i=1 to scanarray.0  */
  1927.  
  1928.    Call TestMatch                                /* test LAST file        */
  1929.  
  1930. Return
  1931.  
  1932. /**************************************************************************/
  1933. /*                                                                        */
  1934. /* Need to accept/reject lines based on type.                             */
  1935. /* Easy ones are Subject: From: To: etc.                                  */
  1936. /* Assume that if variable type (word 1 of line) ends in ':' not text line*/
  1937. /*                                                                        */
  1938. /**************************************************************************/
  1939. FilterLines:
  1940.    
  1941.    skipline=FALSE                                /* assume good line      */
  1942.    select
  1943.        when right(type,1)~=':' & srchmsg then nop
  1944.        when right(type,1)~=':' & srchmsg then nop
  1945.       when type='Subject:' & srchsubj then nop 
  1946.       when type='From:' & srchfrom then nop 
  1947.       when type='Reply-To:' & srchfrom then nop 
  1948.       when type='Sender:' & srchfrom then nop 
  1949.       when type='To:' & srchto then nop 
  1950.       when type='CC:' & srchto then nop 
  1951.       otherwise skipline=TRUE                    /* assume we skip it     */
  1952.    end
  1953.  
  1954. Return
  1955.  
  1956. /**************************************************************************/
  1957. /*                                                                        */
  1958. /* Test for match condition and reset the necessary variables.            */
  1959. /* for 'AND' conditions matchcnt should be the sum of how many searches   */
  1960. /* for 'OR'  any search value found counts as a match                     */
  1961. /*                                                                        */
  1962. /**************************************************************************/
  1963. TestMatch:
  1964.  
  1965.    matchcnt=0                                    /* reset for new file    */
  1966.  
  1967.    do j=1 to srchstr.0
  1968.       matchcnt=matchcnt+srchstr.j.1              /* get match counts      */
  1969.    end
  1970.  
  1971.    if matchcnt>=matchreqs & olddir~=missing then do       /* got a match  */
  1972.       Matches.0=1+Matches.0                      /* count it              */
  1973.       mptr=matches.0
  1974.       Matches.mptr.1=olddir                      /* store directory name  */     
  1975.       Matches.mptr.1.1=oldfile                   /* store file name       */     
  1976.    end
  1977.    olddir=dirname                                /* copy for next break   */
  1978.    oldfile=filename                              /* copy for next break   */
  1979.    do j=1 to srchstr.0                           /* loop thru search vals */
  1980.       srchstr.j.1=0                              /* set matches to zero   */ 
  1981.    end
  1982.  
  1983. Return
  1984.  
  1985. /**************************************************************************/
  1986. /*              Wait until scan program not in task list                  */
  1987. /**************************************************************************/
  1988. WaitScanDone:
  1989.  
  1990.    do timer=1                                    /* allows iterate timer  */
  1991.       Address Command "status > "timerfile
  1992.       foo=delay(delaytm)                         /* pause for command     */
  1993.       goodopen=open('IN',timerfile,'R')
  1994.       if goodopen then do 
  1995.          do until eof('IN')
  1996.             linein=readln('IN')
  1997.             if pos(scanprog,linein)>0 then do
  1998.                result=close('IN')
  1999.                iterate timer                     /* keep looping          */
  2000.             end
  2001.          end
  2002.          result=close('IN')
  2003.          leave timer
  2004.       end
  2005.       else do 
  2006.          infomsg='Couldnt open timerfile'
  2007.          Call InfoMsg
  2008.       end
  2009.    end
  2010.  
  2011. Return
  2012. /******************************************************************************/
  2013. /*                                                                            */
  2014. /* Display informationn about YAMTOOLS, YAM, MUIREXX.                         */
  2015. /*                                                                            */
  2016. /******************************************************************************/
  2017. AboutProgs:
  2018.  
  2019.    bc='\033b\033c'
  2020.    nc='\033n\033c'
  2021.    nl='\n'
  2022.    nl2='\n\n'
  2023.    ct='\033c'
  2024.  
  2025.    Address YAM 'info title'
  2026.    yamtitle=result 
  2027.    Address YAM 'info copyright'
  2028.    yamcopy=result
  2029.    
  2030.    txt.0=23                                                                 
  2031.    txt.1="\033cYAMTOOLS"                               
  2032.    txt.2="\033cCopyright ©1997 by Dick Whiting"
  2033.    txt.3="\033n"                                                        
  2034.    txt.4="--------------------------------------------------------------------"
  2035.    txt.5="\033n"                                                        
  2036.    txt.6="=Standard Disclaimer: I wrote it, it works for me, I don't guarantee"
  2037.    txt.7="=that it will do anything productive for anyone else, etc. etc. ;-)"
  2038.    txt.8="\033n"                                                                    
  2039.    txt.9="=HOWEVER, if you DO find a use for it: I homeschool my kids and they"
  2040.    txt.10="=would love a postcard from where EVER you live."
  2041.    txt.11="\033n"
  2042.    txt.12="=Instant GEOGRAPHY lesson;)"
  2043.    txt.13="\033n"                                                                    
  2044.    txt.14="=POSTCARDS:   Dick Whiting"
  2045.    txt.15="=             28590 S. Beavercreek Rd."
  2046.    txt.16="=             Mulino, Oregon 97042"
  2047.    txt.17="=             USA"
  2048.    txt.18="\033n"                                                                    
  2049.    txt.19="--------------------------------------------------------------------"
  2050.    txt.20="\033n"                                                                    
  2051.    txt.21="\033cAddress Bug Reports or Comments to:"                  
  2052.    txt.22="\033cDick Whiting <dwhiting@europa.com>"
  2053.    txt.23="\033c28 March 1997"
  2054.  
  2055.    select
  2056.       when parm='YAM' then do
  2057.          ab.title="About "||yamtitle||" "||yamcopy
  2058.          aboutlist=FALSE
  2059.          fontsize="ATTRS MUIA_FONT MUIV_Font_Big"
  2060.          aboutmsg=bc||'!! T H A N K   Y O U   M A R C E L !!'         
  2061.          Call AboutWin
  2062.       end
  2063.       when parm='MUIREXX' then do
  2064.          ab.title="About "||parm
  2065.          aboutlist=FALSE
  2066.          aboutmsg=ct||"!! Great Product - Register It !!"
  2067.          Call AboutWin
  2068.       end
  2069.       otherwise do
  2070.          ab.title="About "||parm
  2071.          ab.desc="YamTools -- Add-on Tools For YAM"
  2072.          ab.copy="Version 1.4 Copyright ©1997 by Dick Whiting"
  2073.          ab.text1=yamtitle||' '||yamcopy
  2074.          ab.text2="MuiRexx © Russell Leighton"
  2075.          ab.text3="MUI © Stefan Stuntz"
  2076.          aboutmsg=bc||ab.desc||nl||nc||ab.copy||nl||txt.19||nl||ab.text1||nl||ab.text2||nl||ab.text3
  2077.          Call AboutWin
  2078.          do i=1 to txt.0
  2079.             list ID ABLST INSERT POS MUIV_List_Insert_Bottom STRING txt.i
  2080.          end
  2081.          list ID ABLST POS MUIV_List_Insert_Top
  2082.       end
  2083.    end
  2084.  
  2085. Return
  2086. /******************************************************************************/
  2087. /*  Display window for ABOUT programs.                                        */
  2088. /******************************************************************************/
  2089. AboutWin:
  2090.    window ID YTABT TITLE '"'ab.title'"' MUIA_Window_DepthGadget FALSE,
  2091.           MUIA_Window_DragBar FALSE MUIA_Window_PublicScreen screen
  2092.       group
  2093.          text fontsize LABEL aboutmsg
  2094.       endgroup
  2095.       if aboutlist then do
  2096.          group 
  2097.             list ID ABLST
  2098.          endgroup
  2099.       end
  2100.       group HORIZ
  2101.          group
  2102.             space HORIZ
  2103.          endgroup
  2104.          group
  2105.             button PRESS COMMAND '"window ID YTABT CLOSE"' PORT YAMTOOLS,
  2106.                    LABEL "Ok"
  2107.          endgroup
  2108.          group
  2109.             space HORIZ
  2110.          endgroup
  2111.       endgroup
  2112.    endwindow
  2113.  
  2114. Return
  2115.  
  2116. /******************************************************************************/
  2117. /*  Display ERROR message and EXIT.                                           */
  2118. /******************************************************************************/
  2119. ErrorMsg:
  2120.  
  2121.    window ID YTINF CLOSE
  2122.  
  2123.    request ID ERRM GADGETS '"OK"' errmsg
  2124.  
  2125.    if shutdown then do
  2126.       Address YAMTOOLS "QUIT"
  2127.    end
  2128.  
  2129.    if ~goodconfig then do
  2130.       group ID YTPGS LABELS 'Config'
  2131.    end
  2132.  
  2133.    exit
  2134.  
  2135. Return
  2136.  
  2137. /******************************************************************************/
  2138. /*  Display information message and RETURN                                    */
  2139. /******************************************************************************/
  2140. InfoMsg:
  2141.  
  2142.    request ID INFOM GADGETS '"OK"' infomsg
  2143.  
  2144. Return
  2145.  
  2146. /******************************************************************************/
  2147. /*  Simple information/error message window.                                  */
  2148. /******************************************************************************/
  2149. InfoWindow:
  2150.  
  2151.    window ID YTINF TITLE '"YAM Tools Info"' ATTRS MUIA_Window_PublicScreen screen,
  2152.           MUIA_Window_SizeGadget FALSE MUIA_Window_DragBar FALSE,
  2153.           MUIA_Window_DepthGadget FALSE
  2154.  
  2155.       group 
  2156.          group 
  2157.             text ID STEXT HELP help.STEXT  NODE node.STEXT LABEL infotext
  2158.          endgroup
  2159.          if showbusy then do
  2160.             group
  2161.                object CLASS '"Busy.mcc"' ATTRS MUIA_VertWeight 25
  2162.             endgroup
  2163.          end
  2164.          if infobuttons ~='' then do
  2165.             group HORIZ
  2166.                group 
  2167.                   space HORIZ 
  2168.                endgroup
  2169.                group 
  2170.                   radio ID SQUIT HELP help.SQUIT  NODE node.SQUIT LABELS infobuttons
  2171.                endgroup
  2172.                group 
  2173.                   space HORIZ 
  2174.                endgroup
  2175.             endgroup
  2176.          end
  2177.          else do
  2178.             group 
  2179.                space HORIZ 100
  2180.             endgroup
  2181.          end
  2182.       endgroup
  2183.    endwindow
  2184.  
  2185. Return
  2186.  
  2187. /******************************************************************************/
  2188. /*                          END OF ACTIVE CODE                                */
  2189. /******************************************************************************/
  2190.